package com.china.cnlongdb.server.service;

import java.util.List;

import com.china.cnlongdb.basic.entity.database.LongDataBaseEntity;
import com.china.cnlongdb.basic.entity.database.LongTableEntity;
import com.china.cnlongdb.basic.entity.query.LongDbQuery;
import com.china.cnlongdb.basic.entity.update.LongDbUpdate;

/**
 * 系统名称：LongDbService.java
 * 模块名称：
 * 模块描述：longdb - 数据库提供的接口服务层
 * 功能列表：
 * 模块作者：ZOUYONG
 * 开发时间：2018年12月5日 下午10:10:58
 * 模块路径：com.china.cnlongdb.server.service.LongDbService
 * 更新记录：
 */
public interface LongDbService {

	// 创建数据库
	LongDataBaseEntity createDataBase(String dataBaseName) throws Exception;
	
	// 获取数据库的配置信息
	LongDataBaseEntity getLongDataBaseEntity(String dataBaseName) throws Exception;
	
	// 创建表
	LongTableEntity createTable(String tableName) throws Exception;
	
	// ---------------------------- 新增数据相关方法 ---------------------------------------
	
	// 向表中插入数据
	boolean insert(Object object) throws Exception;
	
	// 指定表名，插入数据
	boolean insert(Object object, String tableName) throws Exception;
	
	// 指定表名，异步插入数据
	boolean insert(Object object, String tableName, boolean isynchronized) throws Exception;
	
	// 向表中批量插入数据
	boolean insertAll(List<Object> objectList, boolean isynchronized) throws Exception;
	
	// 指定表名，向表中批量插入数据
	boolean insertAll(List<Object> objectList, String tableName, boolean isynchronized) throws Exception;
	
	// ---------------------------- 查询数据相关方法 ---------------------------------------
	
	// 查询表中所有数据
	public <T> List<T> findAll(Class<T> cls) throws Exception;
	
	// 查询表中所有数据-指定表名
	public <T> List<T> findAll(Class<T> cls, String tableName) throws Exception;
	
	// 根据条件查询数据
	public <T> List<T> find(LongDbQuery query) throws Exception;
	
	// 根据主键ID查询
	public <T> T findById(String longId, Class<T> cls) throws Exception;
	
	// 根据主键ID查询-指定表名
	public <T> T findById(String longId, Class<T> cls, String tableName) throws Exception;
	
	// 根据条件查询一条数据
	public <T> T findOne(LongDbQuery query) throws Exception;
	
	// 查询总数
	public long count(String tableName) throws Exception;

	// 查询总数
	public <T> long count(Class<T> cls) throws Exception;
	
	// 根据条件查询总数
	public long count(LongDbQuery query) throws Exception;
	
	// 查询某一年所有的数据 yearMothDay:2018-01-01;2018-01-10 (用[;]分号隔开，查询1号到10号的数据)
	public <T> List<T> findByYearMothDay(Class<T> cls, String yearMothDay) throws Exception;
	
	// 查询某一年所有的数据 yearMothDay:2018-01-01;2018-01-10 (用[;]分号隔开，查询1号到10号的数据)
	public <T> List<T> findByYearMothDay(Class<T> cls, String tableName, String yearMothDay) throws Exception;
	
	// 查询某一年所有的数据 yearMothDay:2018-01-01;2018-01-10 (用[;]分号隔开，查询1号到10号的数据)
	public <T> List<T> findByYearMothDay(Class<T> cls, LongDbQuery query, String yearMothDay) throws Exception;
	
	// 查询某一年所有的数据 yearMothDay:2018-01-01;2018-01-10 (用[;]分号隔开，查询1号到10号的数据)
	public <T> List<T> findByYearMothDay(Class<T> cls, LongDbQuery query, String tableName, String yearMothDay) throws Exception;
	
	// 根据年月日查询总数 yearMothDay:2018-01-01;2018-01-10 (用[;]分号隔开，查询1号到10号的数据)
	public long countByYearMothDay(String tableName, String yearMothDay) throws Exception;

	// 根据年月日查询总数 yearMothDay:2018-01-01;2018-01-10 (用[;]分号隔开，查询1号到10号的数据)
	public <T> long countByYearMothDay(Class<T> cls, String yearMothDay) throws Exception;
	
	// 根据年月日根据条件查询总数 yearMothDay:2018-01-01;2018-01-10 (用[;]分号隔开，查询1号到10号的数据)
	public long countByYearMothDay(LongDbQuery query, String yearMothDay) throws Exception;
	
	// ---------------------------- 删除数据相关方法 ---------------------------------------
	
	// 删除指定表中数据
	public boolean remove(String tableName) throws Exception;
	
	// 删除类相关表中数据
	public boolean remove(Class<?> cls) throws Exception;
	
	// 删除查询出来后的数据
	public boolean remove(LongDbQuery query) throws Exception;
	
	// 根据ID删除数据
	public void removeById(String longId, Class<?> cls) throws Exception;
	
	// 删除表及数据
	public boolean drop(String tableName) throws Exception;
	
	// 删除表及数据
	public boolean drop(Class<?> cls) throws Exception;
	
	// 删除数据库
	public boolean dropDataBase(String dataBaseName) throws Exception;

	// ---------------------------- 更新数据相关方法 ---------------------------------------
	
	// 更新表中数据记录
	public boolean update(LongDbQuery query, LongDbUpdate update) throws Exception;
	
	// 根据条件，全部更新，慎用
	public boolean update(LongDbQuery query, Object object) throws Exception;
	
}
